package com.example.demo.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 文件 MD5 计算工具类
 */
public class MD5Util {

    /**
     * 计算文件的 MD5 值，返回 32 位小写十六进制字符串
     *
     * @param file 目标文件
     * @return MD5 字符串，计算失败返回 null
     */
    public static String getFileMD5(File file) {
        if (file == null || !file.exists() || !file.isFile()) {
            return null;
        }

        MessageDigest digest;
        try {
            digest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }

        try (FileInputStream in = new FileInputStream(file)) {
            byte[] buffer = new byte[8192]; // 8KB 缓冲区
            int len;
            while ((len = in.read(buffer)) != -1) {
                digest.update(buffer, 0, len);
            }
            byte[] result = digest.digest();
            return new BigInteger(1, result).toString(16);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 补齐 32 位（MD5 标准长度）
     *
     * @param md5 源字符串
     * @return 32位小写 MD5 字符串
     */
    public static String padMD5(String md5) {
        if (md5 == null) return null;
        return String.format("%32s", md5).replace(' ', '0');
    }

    /**
     * 获取标准 32 位小写 MD5
     *
     * @param file 文件对象
     * @return 32位小写 MD5，失败返回 null
     */
    public static String getFileMD5Hex(File file) {
        String md5 = getFileMD5(file);
        if (md5 == null) return null;
        return padMD5(md5);
    }

    // ========== 使用示例 ==========

    public static void main(String[] args) {
        File file = new File("example.txt"); // 替换为你的文件路径

        String md5 = getFileMD5Hex(file);
        if (md5 != null) {
            System.out.println("文件 MD5: " + md5);
        } else {
            System.out.println("MD5 计算失败，文件可能不存在或无法读取。");
        }
    }
}